iT邦幫忙

DAY 23
0

科學運算和資料處理的潛力新秀--Julia語言系列 第 23

julia (23) -- 深入解析DataFrame,順道一提parametric type

  • 分享至 

  • xImage
  •  

昨天大致完成了模型的cross validation,把昨天的程式稍微模組化,然後使用apply_forest()來產生預測結果,寫入檔案之後,就可以把它上傳到Kaggle了。分數大約是0.75左右。差強人意但也不算太壞,因為這邊所有模型的參數都是我自己憑感覺下的,應該還有一點再優化的空間。由於我們這個系列文章是以介紹julia的語言和特性為主,所以接下來的工作就讓有興趣的讀者們繼續研究。我的ijulia notebook一樣是放在nbviewer上歡迎大家下載指教

前面我們用了DataFrame這個資料結構來存放表格式的資料,接下來我想花一些時間對這個資料結構做個比較深入的介紹。DataFrame這個package雖然是目前julia社群用來處理表格式資料的主流,但它的官方說明文件實在是很殘缺不齊,如果沒有花時間深入研究它的code來了解它的基本架構的話就沒辦法做用自如。我自己花了一點時間看DataFrame package的code之後覺得它還蠻有趣的,也發現它也很適合當一些julia進階語法的應用實例。

首先是Parametric Type。Parameteric Type的功能有點類似C++裡的Template。假設我們定義了一個名為長方型(Rect)的type,它包含兩個子元素,長(width)和寬(height),但是width以及的height的Type還沒確定下來,它們可以是整數,也可以是浮點數。

type Rect{T}
  width::T
  height::T
end

T可以是任何Type。如果你只想把julia當成像python那樣的語言來使用,那麼parametric type在你的程式碼裡頭幾乎不需要出現。因為Rect這個Type寫這樣子也是完全可以的:

type Rect
  width
  height
end

這兩個寫法其中一個重要的分別在於,前者可以讓編譯器有機會在編譯時期就把code最佳化,但是不指定type的寫法只能讓julia在執行期才決定變數的Type。比方說,如果我們已經確定四邊型的長和寬都是整數的話,那麼我們就可以把計算面積的函式寫成這樣:

function area(Rect{Int64})
    return Rect.width*Rect.height
end

如果不用parametric type的話,會是這樣:

function area(Rect)
    return Rect.width*Rect.height
end

在第一種寫法的情形下,編譯器就可以把area()函式針對整數相乘最差化,而且我們也可以針對不同型別而有不同的做法,例如,如果長和寬是字串的話,那麼面積顯然就不能直接相乘了,而必須轉換型別:

function area(Rect{String})

    return int(Rect.width)*int(Rect.height)

end

而這個轉換Type的動作是julia編譯器無法代勞的。

當然如果你很堅持不用parametric type,這個function也可以寫成這樣:

function area(Rect)
    
    if typeof(Rect.width)==ASCIIString
        width=float(Rect.width)
    else
        width=Rect.width
    end

    if typeof(Rect.height)==ASCIIString
        height=float(Rect.height)
    else
        height=Rect.height
    end

    return width*height
end

不是不行,但是執行的效能就會差一些。julia的可以寫得像python,也可以寫得像C/C++,當寫得比較像C/C++的時候就會跑得比較快,而parametric type這個設計就是為了讓你的julia code更靠近C/C++用的。


上一篇
julia (22) -- random forest classification
下一篇
julia (24) -- 深入了解DataFrame的結構
系列文
科學運算和資料處理的潛力新秀--Julia語言30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言